﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.ObjectModel;
using Entidades.Seguridad;

namespace Vista.Seguridad
{
    public partial class FormGestionarPerfiles : Form
    {

        private Entidades.Seguridad.Usuario _Usuario;
        private ReadOnlyCollection<Entidades.Seguridad.Perfil> _Perfiles;

        //BindingSource bsPerfiles;
        ReadOnlyCollection<Entidades.Seguridad.Perfil> colPer;
        
        Entidades.Seguridad.Perfil selPerfil;
        Entidades.Seguridad.Grupo selGrupo;
        Entidades.Seguridad.Formulario selForm;
        Entidades.Seguridad.Permiso selPermiso;

        private static FormGestionarPerfiles instancia;

        public static FormGestionarPerfiles obtener_instancia(Entidades.Seguridad.Usuario oUsuario)
        {
            if (instancia == null)
                instancia = new FormGestionarPerfiles(oUsuario);
            if (instancia.IsDisposed)
                instancia = new FormGestionarPerfiles(oUsuario);

            return instancia;
        }


        public FormGestionarPerfiles(Entidades.Seguridad.Usuario oUsuario)
        {
            InitializeComponent();
            _Usuario = new Entidades.Seguridad.Usuario();
            _Usuario = oUsuario;

            _Perfiles = Controladora.Seguridad.CUIniciarSesion.ObtenerInstancia().RecuperarPerfilesGrupos(_Usuario);

            this.CenterToScreen();

            foreach (Entidades.Seguridad.Perfil perfil in _Perfiles)
            {
                if (this.Text == perfil.Formulario.Nombre)
                {
                    foreach (Control control in this.Controls)
                    {
                        if (control is Button)
                        {
                            Button boton = (Button)control;

                            if (perfil.Permiso.Nombre == boton.Text) boton.Enabled = true;
                        }
                    }
                }
            }

        }

        private void FormGestionarPerfiles_Load(object sender, EventArgs e)
        {
            cargaCombosDeFiltrada();
            armargrilla();
        }

        private void cargaCombosDeFiltrada()
        {
            //Cargamos el campo de Grupos para el filtrada
            BindingList<Entidades.Seguridad.Grupo> bslGrupos = new BindingList<Entidades.Seguridad.Grupo>();
            ReadOnlyCollection<Entidades.Seguridad.Grupo> colGrupos;
            colGrupos = Controladora.Seguridad.CUGestionarperfiles.ObtenerInstancia().ConsultarGrupos();

            Entidades.Seguridad.Grupo oGru = new Entidades.Seguridad.Grupo();
            oGru.IdGrupo = "TODOS";
            bslGrupos.Add(oGru);

            foreach (Entidades.Seguridad.Grupo oGrup in colGrupos)
            {
                bslGrupos.Add(oGrup);
            }

            cBoxGrupos.DataSource = bslGrupos;
            this.cBoxGrupos.DisplayMember = "IdGrupo";

            //Cargamos el campo de Formularios para el filtrada
            BindingList<Entidades.Seguridad.Formulario> bslFormularios = new BindingList<Entidades.Seguridad.Formulario>();
            ReadOnlyCollection<Entidades.Seguridad.Formulario> colFormularios;

            colFormularios = Controladora.Seguridad.CUGestionarperfiles.ObtenerInstancia().ConsultarFormularios();

            Entidades.Seguridad.Formulario oForm = new Entidades.Seguridad.Formulario();
            oForm.IdFormulario = "0";
            oForm.Nombre = "TODOS";
            bslFormularios.Add(oForm);

            foreach (Entidades.Seguridad.Formulario oFormu in colFormularios)
            {
                bslFormularios.Add(oFormu);
            }

            cBoxFormularios.DataSource = bslFormularios;
            this.cBoxFormularios.DisplayMember = "Nombre";

            //Cargamos el campo de Formularios para el filtrada
            BindingList<Entidades.Seguridad.Permiso> bslPermisos = new BindingList<Entidades.Seguridad.Permiso>();
            ReadOnlyCollection<Entidades.Seguridad.Permiso> colPermisos;

            colPermisos = Controladora.Seguridad.CUGestionarperfiles.ObtenerInstancia().ConsultarPermisos();

            Entidades.Seguridad.Permiso oPer = new Entidades.Seguridad.Permiso();
            oPer.Nombre = "TODOS";
            bslPermisos.Add(oPer);

            foreach (Entidades.Seguridad.Permiso oPermiso in colPermisos)
            {
                bslPermisos.Add(oPermiso);
            }

            this.cBoxPermisos.DataSource = bslPermisos;
            this.cBoxPermisos.DisplayMember = "Nombre";
        }

        private void armargrilla()
        {
            colPer = Controladora.Seguridad.CUGestionarperfiles.ObtenerInstancia().ConsultarPerfiles();

            var result = from item in colPer
                         select new { item.Grupo.IdGrupo, item.Formulario.IdFormulario, item.Formulario.Nombre,Permiso = item.Permiso.Nombre};

            dgvperfiles.DataSource = result.ToList();
            dgvperfiles.Columns["IdFormulario"].Visible = false;

        }

        private void btnfiltrar_Click(object sender, EventArgs e)
        {

            Entidades.Seguridad.Perfil oPerfil = new Entidades.Seguridad.Perfil();
            Entidades.Seguridad.Grupo oGrupo = new Entidades.Seguridad.Grupo();
            Entidades.Seguridad.Formulario oFormulario = new Entidades.Seguridad.Formulario();
            Entidades.Seguridad.Permiso oPermiso = new Entidades.Seguridad.Permiso();

            oGrupo = (Entidades.Seguridad.Grupo)cBoxGrupos.SelectedItem;
            oFormulario = (Entidades.Seguridad.Formulario)cBoxFormularios.SelectedItem;
            oPermiso = (Entidades.Seguridad.Permiso)cBoxPermisos.SelectedItem;

            colPer = Controladora.Seguridad.CUGestionarperfiles.ObtenerInstancia().ConsultarPerfiles(oGrupo, oFormulario, oPermiso);

            var result = from item in colPer
                         select new { item.Grupo.IdGrupo, item.Formulario.IdFormulario, item.Formulario.Nombre, Permiso = item.Permiso.Nombre };

            dgvperfiles.DataSource = result.ToList();
            dgvperfiles.Columns["IdFormulario"].Visible = false;
        }

        private void btnagregar_Click(object sender, EventArgs e)
        {
            Vista.Seguridad.FormPerfiles oFrm = new FormPerfiles();
            oFrm.ShowDialog();
            this.armargrilla();
        }

        private void btneliminar_Click(object sender, EventArgs e)
        {
            DialogResult drEliminar = MessageBox.Show("¿Confirma la baja del perfil " + dgvperfiles.CurrentRow.Cells[0].Value.ToString() + "|" + dgvperfiles.CurrentRow.Cells[2].Value.ToString() + "|" + dgvperfiles.CurrentRow.Cells[3].Value.ToString() + "?", "Baja", MessageBoxButtons.YesNo);
            if (drEliminar == DialogResult.Yes)
            {
                Controladora.Seguridad.CUGestionarperfiles.ObtenerInstancia().EliminarPerfil(selPerfil);
                armargrilla();
            }
        }        

        private void dgvperfiles_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            selGrupo = new Entidades.Seguridad.Grupo();
            selForm = new Entidades.Seguridad.Formulario();
            selPermiso = new Entidades.Seguridad.Permiso();
            selPerfil = new Entidades.Seguridad.Perfil();

            selGrupo.IdGrupo = dgvperfiles.CurrentRow.Cells[0].Value.ToString();
            selForm.IdFormulario = dgvperfiles.CurrentRow.Cells[1].Value.ToString();
            selPermiso.Nombre = dgvperfiles.CurrentRow.Cells[3].Value.ToString();

            selPerfil.Grupo = selGrupo;
            selPerfil.Formulario = selForm;
            selPerfil.Permiso = selPermiso;
        }

        private void btncerrar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}